home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #2
/
Amiga Plus CD - 2004 - No. 02.iso
/
AmiSoft
/
Disk
/
moni
/
FileX-src.lha
/
FileX-src
/
cut.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-06-03
|
16KB
|
812 lines
#include "FileXStructs.h"
#include "FileXStrings.h"
#include "allprotos.h"
static UBYTE BlockFullName[256]; /* Blockverzeichnis- und -filename */
void PrintBlock( void )
{
UBYTE *blockmem;
ULONG blocklaenge;
if( blockmem = GetClip( &blocklaenge ))
{
MyPrint( blockmem, blocklaenge, AktuDD->DisplayTyp, AktuDI->Wnd );
FreeMem( blockmem, blocklaenge );
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
}
/*
* void Copy( struct DisplayData *DD )
*
* Kopiert den markierten Bereich ins Clipboard.
*/
void Copy( struct DisplayData *DD )
{
if( DD->Flags & DD_MARK)
{
ULONG start, end;
DD->Flags &= ~DD_MARK;
MarkOff( DD );
if( DD->CPos > DD->MPos)
{
start = DD->MPos;
end = DD->CPos;
}
else
{
start = DD->CPos;
end = DD->MPos;
}
SaveClip( DD->FD->Mem + start, end - start + 1 );
CursorOn( DD );
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_NOBLOCKMARKED );
}
static void CutBlock( ULONG start, ULONG end, struct DisplayData *DD )
{
struct Speicher s;
if(start>end){long dummy=start;start=end;end=dummy;};
s.len=end-start+1;
if(s.mem = AllocMem(s.len,MEMF_ANY))
{
memcpy(s.mem,DD->FD->Mem+start,s.len);
memmove(DD->FD->Mem+start,DD->FD->Mem+end+1,DD->FD->Len-end);
SaveClip( s.mem, s.len );
DD->FD->Len -= s.len;
CursorMarkOff( DD );
AllDisplay( DD->FD, SCROLLERNEU );
SetScrollerGadget(DD);
/* Haben wir alles weggeschnitten? */
if( DD->FD->Len == 0 )
DD->CPos = 0;
else
{
/* Falls Ende auch gleichzeitig Fileende ist, */
/* Cursor auf Fileende-1 setzen */
if( end != DD->FD->Len + s.len - 1 )
DD->CPos = start;
else
DD->CPos = DD->FD->Len -1;
CursorMarkOn( DD );
}
/* Eintrag in Undolist */
AddUndoCut(start, s, DD->FD );
UpdateAllStatusZeilen( DD->FD );
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, s.len );
}
}
void Cut( struct DisplayData *DD )
{
if((DD->Flags & DD_MARK)&&(!(DD->FD->Typ == FD_GRAB)))
{
DD->Flags &= ~DD_MARK;
MarkOff( DD );
CutBlock( DD->CPos, DD->MPos, DD );
CursorOn( DD );
SetCursor( DD->CPos, DD );
}
else
{
if( DD->FD->Typ == FD_GRAB)
DisplayLocaleText( MSG_INFO_GLOBAL_CUTTINGNOTPOSSIBLEINGRABMODE );
else if( !( DD->Flags & DD_MARK))
DisplayLocaleText( MSG_INFO_GLOBAL_NOBLOCKMARKED );
}
}
/*
* void CutBlockForce(ULONG start, ULONG end)
*
* Schneidet den Block von start bis end (einschließlich) raus
* OHNE ihn irgendwo zu speichern
*/
void CutBlockForce( ULONG start, ULONG end, struct DisplayData *DD )
{
ULONG blocklaenge;
if(start>end){ULONG dummy=start;start=end;end=dummy;};
blocklaenge=end-start+1;
memmove(DD->FD->Mem+start,DD->FD->Mem+end+1,DD->FD->Len-end);
DD->FD->Len-=blocklaenge;
CursorMarkOff( DD );
AllDisplay( DD->FD, SCROLLERNEU );
SetScrollerGadget( DD );
/* Haben wir alles weggeschnitten? */
if( DD->FD->Len == 0 )
DD->CPos = 0;
else
{
/* Falls Ende auch gleichzeitig Fileende ist, */
/* Cursor auf Fileende-1 setzen */
if( end != DD->FD->Len + blocklaenge - 1 )
DD->CPos = start;
else
DD->CPos = DD->FD->Len -1;
CursorMarkOn( DD );
}
UpdateAllStatusZeilen( DD->FD );
}
/*
* void Paste(long pos )
*
* Überschreibt den Bereich ab pos mit dem aktuellen Block im Blockspeicher.
* Falls dieser nicht rein paßt, wird gefragt, ob dieser gekürzt reingeschrieben
* werden soll.
*
* Neudarstellung des Fensterinhaltes.
*/
void Paste( struct DisplayData *DD )
{
struct Speicher s;
s.mem = GetClip( &s.len );
if( s.len && s.mem )
{
struct Speicher ps;
if( s.len > DD->FD->Len - DD->CPos ) /* Paßt Block rein? */
{
ps.len = DD->FD->Len - DD->CPos; /* Nein => Länge kürzen */
/* Garnichts paßt rein => Nichts machen */
if( ps.len == 0 )
return;
/* Fragen: Trotzdem füllen? */
if( FALSE == MyFullRequest( MSG_INFO_GLOBAL_BLOCKDOESNTFIT, MSG_GADGET_YESNO, s.len-ps.len))
return; /* Nein => Benden */
}
else
ps.len = s.len;
if( ps.mem = AllocMem( ps.len, MEMF_ANY ))
{
/* Alten Bereich sichern */
memcpy(ps.mem,DD->FD->Mem+DD->CPos,ps.len);
/* Block in Speicher kopieren und Display neudarstellen */
memcpy( DD->FD->Mem + DD->CPos, s.mem, ps.len );
/* Eintrag in Undoliste */
AddUndoPaste(DD->CPos,ps, s, DD->FD);
/* Alles neudarstellen */
AllDisplay( DD->FD, SCROLLERNEU );
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, ps.len );
}
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
}
/*
* void InsertBlock( void )
*
* Fügt ab DD->CPos einen Block ein. Eintrag in die Undoliste.
*
* Neudarstellung des Fensterinhaltes.
*/
void InsertBlock( struct DisplayData *DD )
{
struct Speicher s;
s.mem = GetClip( &s.len );
if( s.len && s.mem )
{
/* Prüfen, ob wir neuen Speicher brauchen */
if( DD->FD->RLen - DD->FD->Len >= s.len )
{
/* Rest nach hinten verschieben */
memmove(DD->FD->Mem+DD->CPos+s.len,DD->FD->Mem+DD->CPos,DD->FD->Len-DD->CPos);
/* Block einfügen */
memcpy(DD->FD->Mem+DD->CPos,s.mem,s.len);
DD->FD->Len+=s.len;
}
else
{
UBYTE *neumem;
long neulaenge=s.len+DD->FD->Len;
if(neumem = AllocMem(neulaenge,MEMF_ANY))
{
/* Den sich nicht ändernden Anfang kopieren */
memcpy(neumem,DD->FD->Mem,DD->CPos);
/* Block kopieren */
memcpy(neumem+DD->CPos,s.mem,s.len);
/* Den Rest kopieren */
memcpy(neumem+DD->CPos+s.len,DD->FD->Mem+DD->CPos,DD->FD->Len-DD->CPos);
/* Alten Speicher freigeben */
if( DD->FD->Mem && DD->FD->RLen )
{
FreeMem( DD->FD->Mem, DD->FD->RLen );
DD->FD->Mem = 0;
DD->FD->RLen = DD->FD->Len = 0;
}
/* Neuen Speicher eintragen */
DD->FD->Mem=neumem;
DD->FD->RLen = DD->FD->Len = neulaenge;
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, neulaenge );
return;
}
}
AddUndoInsert( DD->CPos, s, DD->FD);
SetScrollerGadget(DD);
AllDisplay( DD->FD, SCROLLERNEU );
UpdateAllStatusZeilen(DD->FD);
if( DD->FD->Len - s.len == 0 ) CursorMarkOn(DD);
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
}
/*
* void InsertBlockForce(long pos, UBYTE *mem, ULONG len, struct DisplayData *DD )
*
* Fügt ab pos einen Block ein. Kein Eintrag in die Undoliste.
*
* Neudarstellung des Fensterinhaltes.
*/
void InsertBlockForce( long pos, UBYTE *mem, ULONG len, struct DisplayData *DD )
{
if( len && mem )
{
/* Prüfen, ob wir neuen Speicher brauchen */
if(DD->FD->RLen-DD->FD->Len >= len )
{
/* Rest nach hinten verschieben */
memmove(DD->FD->Mem+pos+len,DD->FD->Mem+pos,DD->FD->Len-pos);
/* Block einfügen */
memcpy(DD->FD->Mem+pos,mem,len);
DD->FD->Len+=len;
}
else
{
UBYTE *neumem;
long neulaenge=len+DD->FD->Len;
if(neumem = AllocMem(neulaenge,MEMF_ANY))
{
/* Den sich nicht ändernden Anfang kopieren */
memcpy(neumem,DD->FD->Mem,pos);
/* Block kopieren */
memcpy(neumem+pos,mem,len);
/* Den Rest kopieren */
memcpy(neumem+pos+len,DD->FD->Mem+pos,DD->FD->Len-pos);
/* Alten Speicher freigeben */
if( DD->FD->Mem && DD->FD->RLen )
{
FreeMem( DD->FD->Mem, DD->FD->RLen );
DD->FD->Mem = 0;
DD->FD->RLen = DD->FD->Len = 0;
}
/* Neuen Speicher eintragen */
DD->FD->Mem=neumem;
DD->FD->RLen = DD->FD->Len = neulaenge;
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, neulaenge );
return;
}
}
SetScrollerGadget(DD);
AllDisplay( DD->FD, SCROLLERNEU );
UpdateAllStatusZeilen(DD->FD);
if( DD->FD->Len - len == 0 ) CursorMarkOn(DD);
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
}
/*
* void AppendBlock( void )
*
* Fügt Clipboard am Ende ein.
*
* Neudarstellung des Fensterinhaltes.
*/
void AppendBlock( struct DisplayData *DD )
{
struct Speicher s;
s.mem = GetClip( &s.len );
if( s.len && s.mem )
{
/* Prüfen, ob wir neuen Speicher brauchen */
if( DD->FD->RLen-DD->FD->Len >= s.len )
{
/* Block einfügen */
memcpy(DD->FD->Mem+DD->FD->Len,s.mem,s.len);
DD->FD->Len+=s.len;
}
else
{
UBYTE *neumem;
long neulaenge=s.len+DD->FD->Len;
if(neumem = AllocMem(neulaenge,MEMF_ANY))
{
/* Den sich nicht ändernden Anfang kopieren */
memcpy(neumem,DD->FD->Mem,DD->FD->Len);
/* Block kopieren */
memcpy(neumem+DD->FD->Len,s.mem,s.len);
/* Alten Speicher freigeben */
if( DD->FD->Mem && DD->FD->RLen )
{
FreeMem( DD->FD->Mem, DD->FD->RLen );
DD->FD->Mem = 0;
DD->FD->RLen = DD->FD->Len = 0;
}
/* Neuen Speicher eintragen */
DD->FD->Mem=neumem;
DD->FD->RLen=DD->FD->Len=neulaenge;
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, neulaenge );
return;
}
}
AddUndoInsert(DD->FD->Len-s.len, s, DD->FD);
SetScrollerGadget(DD);
AllDisplay( DD->FD, SCROLLERNEU );
UpdateAllStatusZeilen(DD->FD);
if( DD->FD->Len - s.len == 0 ) CursorMarkOn(DD);
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
}
/*
* BOOL LoadBlock(char *fullname)
*
* Läd einen Block ein
*/
BOOL LoadBlock(char *fullname)
{
BPTR fh;
BOOL Success=FALSE;
if(fh=Open(fullname,MODE_OLDFILE))
{
ULONG blocklaenge;
UBYTE *blockmem;
blocklaenge=GetFileLaenge(fh);
if(blocklaenge)
if(blockmem = AllocMem(blocklaenge,MEMF_ANY))
{
Read(fh,blockmem,blocklaenge);
SaveClip( blockmem, blocklaenge );
FreeMem( blockmem, blocklaenge );
Success = TRUE;
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, blocklaenge );
}
Close(fh);
}
else
MyRequest( MSG_INFO_GLOBAL_CANTOPENFILE, ( ULONG )fullname );
return(Success);
}
/*
* BOOL LoadBlockFR(void)
*
* Öffnet einen FileRequester und läd einen Block ein
*/
BOOL LoadBlockFR(void)
{
if( MyRequestFile( BlockFullName, GetStr( MSG_WINDOWTITLE_LOADBLOCK ), 0, FALSE ))
return( LoadBlock( BlockFullName ));
else
return( FALSE );
}
/*
* BOOL SaveBlock(char *Name)
*
* Speichert einen Block ab.
*/
BOOL SaveBlock( char *Name )
{
BPTR fh;
BOOL Success=FALSE;
UBYTE *blockmem;
ULONG blocklaenge;
if( blockmem = GetClip( &blocklaenge ))
{
/* Prüfen, ob File existiert. Falls ja, fragen, ob es überschrieben */
/* werden soll */
if(!(mainflags&MF_OVERWRITE))
if(GetFileLaengeName(Name))
if( 0 == MyFullRequest( MSG_INFO_GLOBAL_FILEALREADYEXISTS, MSG_GADGET_YESNO, ( ULONG )Name ))
return(Success);
if(fh=Open(Name,MODE_NEWFILE))
{
if(blocklaenge!=Write(fh,blockmem,blocklaenge))
{
/* Falls nicht vollständig geschrieben, löschen */
Close(fh);
MyRequest( MSG_INFO_GLOBAL_CANTSAVEFILE, ( ULONG )Name );
DeleteFile(Name);
}
else
{
Success = TRUE;
Close( fh );
}
}
else
MyRequest( MSG_INFO_GLOBAL_CANTOPENFILE, ( ULONG )Name );
FreeMem( blockmem, blocklaenge );
}
else
DisplayLocaleText( MSG_INFO_GLOBAL_BUFFEREMPTY );
return( Success );
}
/*
* BOOL SaveBlockFR( void )
*
* Öffnet einen FileRequester und speichert einen Block ab.
*/
BOOL SaveBlockFR( void )
{
if( MyRequestFile( BlockFullName, GetStr( MSG_WINDOWTITLE_SAVEBLOCK ), 0, FALSE ))
return( SaveBlock( BlockFullName ));
else
return( FALSE );
}
/*
* void Fill(ULONG start, ULONG end,UBYTE *was,ULONG laenge)
*
* Füllt den bestimmten Bereich.
*/
void Fill( ULONG start, ULONG end, UBYTE *was, ULONG laenge, struct DisplayData *DD )
{
struct Speicher f1, f2;
if(laenge==0)return;
if(start>end){ULONG dummy=start;start=end;end=dummy;}
f1.len = f2.len = end-start+1;
if(f1.mem = AllocMem(f1.len,MEMF_ANY))
{
if(f2.mem = AllocMem(f1.len,MEMF_ANY))
{
long pos=start;
/* Alten Bereich sichern */
memcpy(f1.mem,DD->FD->Mem+pos,f1.len);
/* Bereich füllen */
end++;
while(start+laenge<=end)
{
memcpy(DD->FD->Mem+start,was,laenge);
start+=laenge;
}
if(start<=end)
{
memcpy(DD->FD->Mem+start,was,end-start);
}
AllDisplay( DD->FD, SCROLLERNEU );
/* Neuen Bereich sichern */
memcpy(f2.mem,DD->FD->Mem+pos,f1.len);
/* Eintrag in Undoliste */
AddUndoPaste(pos,f1,f2, DD->FD);
}
else
{
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, f1.len );
FreeMem(f1.mem,f1.len);
}
}
else
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, f1.len );
}
/****************************** FillWindow ******************************/
static UBYTE fillstring[256];
static ULONG fillmode = FM_STRING;
void SetFillString( char *String )
{
strcpy( fillstring, String );
}
UBYTE *GetFillString( void )
{
return( fillstring );
}
void SetFillMode( ULONG Mode )
{
fillmode = Mode;
}
ULONG GetFillMode( void )
{
return( fillmode );
}
enum {
GD_FILL_STRINGFILL,
GD_FILL_STRING,
GD_FILL_FILL,
GD_FILL_CANCEL
};
static struct MyNewGadget FillNewGadgets[] =
{
CHECKBOX_KIND, 0, 0, 0, MSG_GADGET_FILL_STRINGFILL, 0, 0, 0, 0, 0,
STRING_KIND, 0, 0, 0, MSG_GADGET_FILL_STRING, 0, 256, 0, 0, 30,
BUTTON_KIND, GP_LEFTBOTTOM, 0, 0, MSG_GADGET_FILL_FILL, 0, 0, 0, 0, 0,
BUTTON_KIND, GP_RIGHTBOTTOM, 0, 0, MSG_GADGET_CANCEL, 0, 0, 0, 0, 0,
0
};
static struct WindowData FillWD =
{
NULL, NULL, FALSE, NULL, NULL,
0,0,
&FillNewGadgets[ 0 ], 4
};
static void DoFillWndMsg( void )
{
struct IntuiMessage *m, Msg;
struct Gadget *gad;
int Select = -1; /* Wie wurde Window verlassen ? (Nicht/Cancel/Fill) */
while( m = GT_GetIMsg( FillWD.Wnd->UserPort ))
{
CopyMem(( char * )m, ( char * )&Msg, (long)sizeof( struct IntuiMessage ));
GT_ReplyIMsg( m );
KeySelect(FillWD.Gadgets, &Msg);
gad = (struct Gadget *) Msg.IAddress;
switch( Msg.Class )
{
case IDCMP_REFRESHWINDOW:
GT_BeginRefresh( FillWD.Wnd );
GT_EndRefresh( FillWD.Wnd, TRUE );
break;
case IDCMP_VANILLAKEY:
if( Msg.Code == 13)
Select = 1;
break;
case IDCMP_CLOSEWINDOW:
Select = 0;
break;
case IDCMP_GADGETUP:
switch(gad->GadgetID)
{
case GD_FILL_STRING:
if( FillNewGadgets[ GD_FILL_STRINGFILL ].CurrentValue == FALSE )
if(-1==TestHexString(GetString(FillWD.Gadgets[GD_FILL_STRING])))
ActivateGadget(FillWD.Gadgets[GD_FILL_STRING],FillWD.Wnd,0);
break;
case GD_FILL_STRINGFILL:
((struct MyNewGadget *)gad->UserData)->CurrentValue = !((struct MyNewGadget *)gad->UserData)->CurrentValue;
break;
case GD_FILL_FILL:
Select = 1;
break;
case GD_FILL_CANCEL:
Select = 0;
break;
}
break;
}
}
if( Select == 1 ) /* Falls nicht cancel, Werte merken */
{
strcpy( fillstring, GetString( FillWD.Gadgets[ GD_FILL_STRING ] ));
if( FillNewGadgets[ GD_FILL_STRINGFILL ].CurrentValue )
fillmode = FM_STRING;
else
fillmode = FM_NUMBER;
}
if( Select != -1 )
{
MyRemoveSignal( 1L << FillWD.Wnd->UserPort->mp_SigBit );
NewCloseAWindow( &FillWD );
}
if( Select == 1 )
FillDD( AktuDD );
}
void OpenFillWindow( void )
{
ULONG err;
if( FillWD.Wnd )
{
ActivateWindow( FillWD.Wnd );
return;
}
FillNewGadgets[ GD_FILL_STRING ].CurrentValue = (LONG) fillstring;
FillNewGadgets[ GD_FILL_STRINGFILL ].CurrentValue = ( fillmode & FM_STRING ) ? TRUE : FALSE;
if( err = NewOpenAWindow( &FillWD, GetStr(MSG_WINDOWTITLE_FILL)))
MyRequest( MSG_INFO_GLOBAL_CANTOPENWINDOW, err );
else
{
MyAddSignal( 1L << FillWD.Wnd->UserPort->mp_SigBit, &DoFillWndMsg );
}
}
void FillDD( struct DisplayData *DD )
{
switch(GetFillMode())
{
case FM_STRING:
Fill(DD->CPos,DD->MPos,GetFillString(),strlen( GetFillString()), DD);
break;
case FM_NUMBER:
if(-1!=TestHexString(GetFillString()))
{
UBYTE hexfillstring[256];
Fill(DD->CPos,DD->MPos,hexfillstring,ConvertHexstringToHexnumber(GetFillString(),hexfillstring), DD);
}
break;
}
}